﻿#pragma once

#include<math.h>
#include<iostream>
#include <algorithm>
#include <optional>
#include <iomanip>

#include "dataStructAlg.h"

// Utils中的函数
double norm(Point a);
double norm(const Line& a);
double cross(Point a, Point b);											// 叉乘

double getTwoLinesDist(Line line1, Line line2);
double backMinDistNum(std::vector<double> DistNums);
double pointToSegmentDistance(Point basePoint, Line baseLine);			// 计算一个点到一条线段的最短距离
Point getProjectionPoint(Point basePoint, Line baseLine);				// 求出投影点的位置
Point RotateVec(Point vec, double angle);								// 返回向量旋转后的角度 || > 0 --> 逆时针
Point getInsection(Point Vec1, Point p1, Point Vec2, Point p2);			// 已知两条线段的方向向量和线段上一点求两条直线的交点，求交点
Point rotate(Point vec, double angle);                                  // 向量旋转,[1] > 0:逆时针
bool crossSegs(Line line1, Line line2);									// 优化判断：两条线段是否有交点
bool judgeCrossPoint(Point point, Line line);							// 判断点是否在线段中间
double CrossVecs(Point a, Point b);                                     // 两个向量的叉乘
void NormalizeVec(Point& NormalVec);                                    // 向量单位化
double pointToLineDist(Point point, Line line1);						// 点到直线的距离
double linearDist(Point point1, Point point2);							// 得到两点之间的直线距离
Point getLineNearestPoint(Point baseP, Line baseL);						// 在baseL中找到和baseP最近的端点
bool checkPointInSegment(Point tP, Line segmentL);						// 检查一个点是否在一条线段上面
void exchangePoints(Point& point1, Point& point2);						// 交换两点（向量）的坐标并返回
int direction(Line& line, Point& point);								// 用来判断推挤线是否超过相邻线段的水平位置
bool isParallel_lines(Line line1, Line line2);							// 两条线是否是平行线
bool CheckLinesPerpendicular(Line firstSeg, Line SecondSeg);			// 判断
bool inspectVectorsDirection(Point vec1, Point vec2);					//判断两个向量方向一致否
void removeLine(Line line, std::vector<Line>& lines);					//一组线中删除某条线
int getPosition(std::vector<Line>& lines, Line& line);					//获取当前线段在线组中的位置
void mergeLines(std::vector<Line>& lines);								//合并线段


namespace v2Hash {
	struct PointHash {
		size_t operator()(const Point& pnt)const;
	};
	struct LineHash {
		size_t operator()(const Line& line)const;
	};
}







